查看原文
其他

一根毛让微信崩了......

葫芦娃 看雪学院 2019-09-18

今日,小编注意到打开微信群时,微信总是会闪退。如下:



正在百思不得其解之时,小编发现,原来就是下面这个动图惹得鬼:


那一根“毛”,缓缓落下.......



样本md5:653b5f03a500b82a3949740d6aedc0f9

微信在加载这张图的过程中,会出现闪退,而且概率很高,基本上每次都崩。

 

迷人的是,对于这张图,只有微信版安卓有效,iOS版、PC/MAC甚至网页版都可以正常显示,当然迫于时间原因,我们也没有测量到安卓版微信的每一个版本,大家都在微信7上测过了都会崩。


究竟是为什么呢?我们邀请看雪会员葫芦娃对此事进行分析。



以下分析由葫芦娃(看雪ID:葫芦娃)提供

 

崩溃信息如下所示:

 

 

崩溃地址在libwechatcommon.so (Java_com_tencent_mm_plugin_gif_MMGIFJNI_drawFramePixels+124),也就是本地GIF库在画帧的像素的时候崩溃了。那我们到libwechatcommon.so里去看下这个drawFramePixels函数的+124处长什么样子:

 

 

这里应该是个溢出,也可能是个bug,但是没有源码,很难进一步分析,我们改变思路,看看能不能修好这个gif。

 

既然是画gif的帧像素的过程中出现的bug,那我们来看下这个帧,看看能不能找到“罪魁祸首”的那一帧。

 

打开gif的文件格式,可以看到有文件头、屏幕描述、颜色表、具体数据和文件尾。打开即可解析,说明文件格式还是很标准的,这也解释了为什么iOS、PC/MAC和网页版都是OK的原因。

 

 

接下来既然是Frame的问题,我们来看每一帧,帧的组合在gif文件格式中也非常规整,打开struct DATA Data就可以看到,每一帧的图形拓展、描述和数据都在里面。

 

 

最后观察到一个现象,就是根据微信崩溃的时机,是在图像的加载之初,说明很有可能在第一帧、第二帧就出现问题,我们观察前三帧的异同,发现第二帧的ImageLeftPosition有很大的嫌疑。

 

 

8166这个数字明显太大了,我们把它改成0之后,再发送出去,发现已经不崩溃了。





- End -





热门图书推荐:

立即购买!



征题正在火热进行中!

(晋级赛Q1即将于3月10日开启,敬请期待!)



推荐阅读
















公众号ID:ikanxue

官方微博:看雪安全

商务合作:wsc@kanxue.com


点击下方“阅读原文”

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存